package bombita.modelo.Personajes;

import org.jdom2.Element;

import bombita.modelo.CosaDelMapaSincronica;
import bombita.modelo.Direccion;
import bombita.modelo.Interactuador;
import bombita.modelo.Armas.Arma;
import bombita.modelo.Armas.NoSePuedeDispararException;
import bombita.modelo.Interfaces.Movil;
import bombita.modelo.Movimientos.Movimiento;
import bombita.modelo.Obstaculos.NoPasarException;
import bombita.persistencia.Deserializador;

//TODO hacer abstracto
public class Personaje extends CosaDelMapaSincronica implements Movil
{
	protected enum Acciones {NADA, DISPARAR, MOVER}
	
	
	protected Arma miArma;
	protected Movimiento miMovimiento;
	protected int miVida;
	protected int yoDanio;
	protected boolean sostenerMovimiento;
	protected boolean esperaAtacar;
	protected Direccion direccion;
	
	private void realizarDisparar()
	{
		try{
			miPosicion.agregar(miArma.disparar(direccion));
		}catch(NoSePuedeDispararException e1){
		}
	}
	
	@Override
	public void recibirPulsoReloj(float tiempo)
	{
		this.miArma.recibirPulsoReloj(tiempo);
		this.miMovimiento.recibirPulsoReloj(tiempo);
		if (esperaAtacar) {
			this.realizarDisparar();
			esperaAtacar = false;
		} else if (sostenerMovimiento) {
			this.miMovimiento.mover(direccion, this);
		}
	}

	public void recibirDano(int dano)
	{
		this.miVida = this.miVida - dano;
		if(this.miVida == 0){
			this.morir();
		}
	}

	public void mover(Direccion direccion) {
		if (direccion == null) {
			sostenerMovimiento = false;
		} else {
			sostenerMovimiento = true;
			this.direccion = direccion;
		}
	}

	public void disparar()
	{
		this.esperaAtacar = true;
	}

	public void morir()
	{
		this.miVida = 0;
		this.destruir();
	}

	public void interactuarCon(Interactuador unaCosa) throws NoPasarException{
		unaCosa.interactuarConPersonaje(this);
	}

	protected String miJugador;
	
	@Override
	public Element serializar() {
		Element nodo = super.serializar();
		nodo.setAttribute("hp", Integer.toString(miVida));
		if (miJugador != null) {
			nodo.setAttribute("jugador", miJugador);
		}
		nodo.addContent(miArma.serializar());
		nodo.addContent(miMovimiento.serializar());
		return nodo;
	}

	@Override
	public void aplicarSerializado(Element nodo) throws Exception {
		super.aplicarSerializado(nodo);
		miVida = nodo.getAttribute("hp").getIntValue();
		miJugador = nodo.getAttributeValue("jugador");
		miArma = (Arma) Deserializador.deserializar("bombita.modelo", nodo, "Arma.*");
		miMovimiento = (Movimiento) Deserializador.deserializar("bombita.modelo", nodo, "Movimiento.*");
	}
}
